package com.jeasonzhao.report.model;

import com.jeasonzhao.report.codes.ReportMergeModes;

public class ReportColumnCollection extends java.util.Vector<ReportColumn>
{
    private static final long serialVersionUID = 1L;
    public ReportColumnCollection()
    {
        super();
    }

    public static ReportColumnCollection from(Iterable<ReportColumn> colls)
    {
        if(null == colls)
        {
            return null;
        }
        ReportColumnCollection coll = new ReportColumnCollection();
        for(java.util.Iterator<ReportColumn> it = colls.iterator();it.hasNext();)
        {
            coll.add(it.next());
        }
        return coll;
    }

    public String toString()
    {
        return toString("",false);
    }

    public ReportColumn getColumnByFieldName(String strName)
    {
        for(int n = 0;n < this.size();n++)
        {
            ReportColumn col = this.get(n);
            if(col.getFieldName() != null && col.getFieldName().trim().equalsIgnoreCase(strName))
            {
                return col;
            }
        }
        return null;
    }

    public ReportColumn getColumnByFieldOrGuid(String strName)
    {
        ReportColumn col = getColumnByFieldName(strName);
        if(null == col)
        {
            col = getColumnByGuid(strName);
        }
        return col;
    }

    public ReportColumn getColumnByGuid(String strName)
    {
        for(int n = 0;n < this.size();n++)
        {
            ReportColumn col = this.get(n);
            if(col.getGuid() != null && col.getGuid().trim().equalsIgnoreCase(strName))
            {
                return col;
            }
        }
        return null;
    }

    public String toString(String str,boolean appendAtFirst)
    {
        StringBuffer strRet = new StringBuffer();
        for(int n = 0;n < this.size();n++)
        {
            if(null != str && (n > 0 || appendAtFirst))
            {
                strRet.append(str);
            }
            strRet.append(this.get(n));
        }
        return strRet.toString();
    }

//    public boolean hasMeasure()
//    {
//        for(int n = 0;n < this.size();n++)
//        {
//            ReportColumn col = this.get(n);
//            if(col.isMeasure())
//            {
//                return true;
//            }
//        }
//        return false;
//    }

//    public int getShownMeasureCount()
//    {
//        int nS = 0;
//        for(int n = 0;n < this.size();n++)
//        {
//            ReportColumn col = this.get(n);
//            if(col.isMeasure() && col.isHide() == false)
//            {
//                nS++;
//            }
//        }
//        return nS;
//    }

    public java.util.List<ReportColumnCollection> arrageRotates()
    {
        int nprevrotateindex = -1;
        for(int n = 0;n < this.size();n++)
        {
            ReportColumn col = this.get(n);
            if(col.getRotateMode().isRotate())
            {
                col.setMeasure(false);
//                col.setGroupMode(ReportGroupModes.None);
                if(col.getRotateGroupNo() < 0)
                {
                    nprevrotateindex = n;
                    col.setRotateGroupNo(nprevrotateindex);
                }
                else
                {
                    nprevrotateindex = col.getRotateGroupNo();
                }
            }
            else if(col.isMeasure() || col.isSummaryable())
            {
                col.setMergeMode(ReportMergeModes.None);
                if(col.isMeasure() && nprevrotateindex > 0 && col.getRotateGroupNo() < 0)
                {
                    col.setRotateGroupNo(nprevrotateindex);
                }
            }
            else
            {
                nprevrotateindex = -1;
                col.setRotateGroupNo(nprevrotateindex);
            }
            //System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>COL  "+col.getTitle()+"["+col.isRotate()+":"+col.isMeasure()+"]"+col.getRotateGroupNo());
        }
        java.util.ArrayList<ReportColumnCollection> list = new java.util.ArrayList<ReportColumnCollection>();
        ReportColumnCollection subg = null;
        nprevrotateindex = Integer.MAX_VALUE;
        for(int n = 0;n < this.size();n++)
        {
            ReportColumn col = this.get(n);
            if(nprevrotateindex == Integer.MAX_VALUE)
            {
                nprevrotateindex = col.getRotateGroupNo();
                subg = new ReportColumnCollection();
                subg.add(col);
            }
            else if(nprevrotateindex != col.getRotateGroupNo())
            {
                list.add(subg);
                nprevrotateindex = col.getRotateGroupNo();
                subg = new ReportColumnCollection();
                subg.add(col);
            }
            else
            {
                subg.add(col);
            }
        }
        if(null != subg && subg.size() > 0)
        {
            list.add(subg);
        }
//        for(int n=0;n<list.size();n++)
//        {
//            ReportColumnCollection ro=(ReportColumnCollection)list.get(n);
//            System.out.println(ro.hasRotate()+"---------"+ ro.toString("   ",false));
//        }
        return list;
    }

    public int[] getRotateGroupNos()
    {
        java.util.HashSet<Integer> hash = new java.util.HashSet<Integer>();
        for(int ncol = 0;ncol < this.size();ncol++)
        {
            ReportColumn col = this.get(ncol);
            if(col == null || col.getRotateGroupNo() <= 0 || hash.contains(new Integer(col.getRotateGroupNo())))
            {
                continue;
            }
            hash.add(new Integer(col.getRotateGroupNo()));
        }
        int[] ret = new int[hash.size()];
        int nindex = 0;
        for(java.util.Iterator<Integer> it = hash.iterator();it.hasNext();)
        {
            ret[nindex] = it.next().intValue();
            nindex++;
        }
        return ret.length < 1 ? null : ret;
    }

}
